/*
 *https://leetcode.cn/problems/count-numbers-with-unique-digits
 *2376. 统计特殊整数
 *数位DP
*/
class Solution {
public:
    // 计算排列 A(n, k) = n * (n-1) * ... * (n-k+1)
    static long long A(int n, int k) {
        long long ans = 1;
        for (int i = 0; i < k; ++i) {
            ans *= (n - i);
        }
        return ans;
    }

    // 计算由 i 个不重复数字构成的特殊整数的数量
    int special_numbers_i(int i, int k, bool allow_zero_first, bool is_zero_used) {
        if (is_zero_used) {
            // 如果 0 已经被使用过，则剩余的 10-k 个数字中选择 i 个
            return A(10 - k, i);
        } else {
            if (allow_zero_first) {
                // 允许 0 作为首位，则剩余的 10-k 个数字中选择 i 个
                return A(10 - k, i);
            } else {
                // 不允许 0 作为首位，则从 9-k 个非零数字中选择 i 个
                return A(10 - k, i) - A(9 - k, i);
            }
        }
    }

    // 检查某个位是否已经被使用
    static inline bool is_used(unsigned int flag, int i) {
        return (flag >> i) & 1;
    }

    // 标记某个位已被使用
    static inline void set_used(unsigned int &flag, int i) {
        flag = flag | (1 << i);
    }

    // 取消标记某个位的使用
    static inline void set_unused(unsigned int &flag, int i) {
        flag = flag & ~(1 << i);
    }

    // 计算已经使用的位数
    static inline int get_used_cnt(unsigned int flag) {
        int cnt = 0;
        while (flag > 0) {
            cnt += flag & 1;
            flag = flag >> 1;
        }
        return cnt;
    }

    // 递归函数 f 用于计算 num_string 中的特殊整数数量
    int f
